//package org.example.util.file;
//
//import cn.hutool.json.JSONUtil;
//import com.njwx.yq.business.knowledge_platform.entity.rt.FilePathRt;
//import org.example.common.bean.CommonException;
//import org.example.common.bean.ResponseBean;
//import org.example.common.constant.Constants;
//import org.example.common.feign.inner.common.fastdfs.FastDfsFeign;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.pdfbox.cos.COSName;
//import org.apache.pdfbox.pdmodel.PDDocument;
//import org.apache.pdfbox.pdmodel.PDPage;
//import org.apache.pdfbox.pdmodel.PDPageTree;
//import org.apache.pdfbox.pdmodel.PDResources;
//import org.apache.pdfbox.pdmodel.graphics.PDXObject;
//import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
//import org.apache.pdfbox.text.PDFTextStripper;
//import org.springframework.web.multipart.MultipartFile;
//
//import javax.imageio.ImageIO;
//import java.awt.image.BufferedImage;
//import java.io.ByteArrayOutputStream;
//import java.io.File;
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.*;
//
///**
// * @author: ZhangMingmin
// * @since: 2024-11-29 15:41
// * @description:
// */
//@Slf4j
//public class PdfDetailUtil {
//
//    /**
//     * 抽取 PDF 全文文字
//     * @param fis PDF 文件流
//     * @return 提取的文本内容（包含换行符）(一页一个文本对象)
//     * @throws IOException 文件操作或 PDF 解析异常
//     */
//    public static List<String> extractFullText(InputStream fis, String filePath) throws IOException {
//        try (PDDocument document = PDDocument.load(fis)) {
//            if (document.isEncrypted()) {
//                log.error("加密 PDF 暂不支持");
//            }
//            int numberOfPages = document.getNumberOfPages();
//            if (numberOfPages > 500){
//                throw new CommonException("页数不超过500页");
//            }
//
//            List<String> resultList = new ArrayList<>();
//            for (int i = 0; i < numberOfPages; i++) {
//                PDFTextStripper stripper = new PDFTextStripper();
//                // 保持文本顺序
//                stripper.setSortByPosition(true);
//                // 起始页（从1开始）
//                stripper.setStartPage(i+1);
//                // 结束页
//                stripper.setEndPage(i+1);
//                String text = stripper.getText(document);
//                log.info("PDF，{},共{}页，目前第{}页抽取文本，字符数：{}",filePath,numberOfPages,stripper.getStartPage(),text.length());
//                resultList.add(text);
//            }
//            return resultList;
//        }
//    }
//
//    /**
//     * 抽取 PDF 的 全文图片
//     *
//     * @param fis PDF 文件流
//     * @return 图片的列表
//     * @throws IOException IOException
//     */
//    public static List<FilePathRt> extractFullImg(InputStream fis, FastDfsFeign fastDfsFeign) throws IOException {
//        try (PDDocument document = PDDocument.load(fis)) {
//            PDPageTree pages = document.getDocumentCatalog().getPages();
//            int pageNum = 1;
//
//            List<BufferedImage> bufferedImages = new ArrayList<>();
//            for (Iterator<PDPage> it = pages.iterator(); it.hasNext(); pageNum++) {
//                PDPage page = it.next();
//                extractImagesFromPage(page, pageNum,bufferedImages);
//            }
//
//            if (bufferedImages.size() > Constants.FILE_PIC_LIMITATION){
//                log.info("PDF文件 图片数据超过{}张",Constants.FILE_PIC_LIMITATION);
//                return new ArrayList<>();
//            }
//            List<FilePathRt> filePathList = new ArrayList<>();
//            for (BufferedImage bufferedImage : bufferedImages) {
//                String fileName = UUID.randomUUID().toString().replace("-", "") + ".png";
//                MultipartFile multipartFile = new BufferedImageToMultipartFile(
//                        bufferedImage,
//                        fileName,
//                        "image/png"
//                );
//
//                long size = multipartFile.getSize() / 1024;
//                ResponseBean<String> responseBean = fastDfsFeign.uploadFile(multipartFile);
//                if (!Objects.equals(responseBean.getCode(), Constants.HTTP_SUCCESS_CODE)){
//                    log.error("PDF图片上传失败：{}",JSONUtil.toJsonStr(responseBean));
//                    continue;
//                }
//                String filePath = responseBean.getData();
//                filePathList.add(FilePathRt.builder()
//                        .fileName(fileName)
//                        .filePath(filePath)
//                        .fileSize(size)
//                        .build());
//            }
//            return filePathList;
//        }
//    }
//
//    /**
//     * 每页抽取图片
//     *
//     * @param page PDF 页码对象
//     * @param pageNum 页码
//     * @throws IOException IOException
//     */
//    private static void extractImagesFromPage(PDPage page, int pageNum, List<BufferedImage> bufferedImages) throws IOException {
//        PDResources resources = page.getResources();
//        if (resources == null) {
//            log.info("第 {} 页无资源", pageNum);
//            return;
//        }
//        for (COSName name : resources.getXObjectNames()) {
//            PDXObject xObject = resources.getXObject(name);
//
//            if (xObject instanceof PDImageXObject) {
//                PDImageXObject image = (PDImageXObject) xObject;
//                BufferedImage bufferedImage = image.getImage();
//                bufferedImages.add(bufferedImage);
//            }
//        }
//    }
//
//    /**
//     * 图片写入文件
//     *
//     * @param img 图片对象
//     * @param outputDir 输出图片的文件目录
//     * @param pageNum 页码
//     * @param image 图片对象
//     * @return 图片的文件路径
//     * @throws IOException IOException
//     */
//    private static String saveImage(BufferedImage img, String outputDir, int pageNum,PDImageXObject image) throws IOException {
//        String safeName = UUID.randomUUID().toString().replace("-","") + "." + getImageFormat(image);
//        String filePath = outputDir + File.separator +safeName;
//
//        ImageIO.write(img, getImageFormat(image), new File(filePath));
//        log.info("第{} 页 ✅ 保存 {}", pageNum, safeName);
//        return filePath;
//    }
//
//    /**
//     * 获取文件后缀
//     *
//     * @param image 图片对象
//     * @return String
//     */
//    private static String getImageFormat(PDImageXObject image) {
//        // 优先使用 PDF 定义的后缀（最准确）
//        if (image.getSuffix() != null) {
//            return image.getSuffix().toLowerCase();
//        }
//        // 回退到 ImageIO 支持的格式 // 默认 PNG
//        return ImageIO.getWriterFormatNames()[0];
//    }
//
//    /**
//     * BufferedImage 转png格式字节数组
//     *
//     * @param image image
//     * @return byte
//     */
//    public static byte[] bufferedImageToPngBytes(BufferedImage image) throws IOException {
//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//        ImageIO.write(image, "png", outputStream);
//        return outputStream.toByteArray();
//    }
//}
